#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <vector>

typedef void (*handler_t)();     // 函数指针类型
std::vector<handler_t> handlers; // 函数指针数组

void fun_one()
{
    printf("这是⼀个临时任务1\n");
}
void fun_two()
{
    printf("这是⼀个临时任务2\n");
}
void Load()
{
    handlers.push_back(fun_one);
    handlers.push_back(fun_two);
}
void handler()
{
    if (handlers.empty())
        Load();
    for (auto iter : handlers)
        iter();
}

int main()
{
    pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        printf("%s fork error\n", __FUNCTION__);
        return 1;
    }
    else if (pid == 0)
    { // child
        printf("child is run, pid is : %d\n", getpid());
        sleep(5);
        exit(1);
    }
    else
    {
        int status = 0;
        pid_t ret = 0;
        do
        {
            ret = waitpid(-1, &status, WNOHANG); // ⾮阻塞式等待
            if (ret == 0)
            {
                printf("child is running\n");
            }
            handler();
        } while (ret == 0);
        
        if (WIFEXITED(status) && ret == pid)
        {
            printf("wait child 5s success, child return code is :%d.\n",
                   WEXITSTATUS(status));
        }
        else
        {
            printf("wait child failed, return.\n");
            return 1;
        }
    }
    return 0;
}

// int main()
// {
//     pid_t pid;
//     pid = fork();
//     if (pid < 0)
//     {
//         printf("%s fork error\n", __FUNCTION__);
//         return 1;
//     }
//     else if (pid == 0)
//     { // child
//         printf("child is run, pid is : %d\n", getpid());
//         sleep(5);
//         exit(257);
//     }
//     else
//     {
//         int status = 0;
//         pid_t ret = waitpid(-1, &status, 0); // 阻塞式等待，等待5S
//         printf("this is test for wait\n");
//         if (WIFEXITED(status) && ret == pid)
//         {
//         printf("wait child 5s success, child return code is:%d.\n",WEXITSTATUS(status));
//         }
//         else
//         {
//             printf("wait child failed, return.\n");
//             return 1;
//         }
//     }
//     return 0;
// }